# models.py

from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

db = SQLAlchemy()

# Webhook 事件模型
class WebhookEvent(db.Model):
    __tablename__ = 'webhook_events'
    id = db.Column(db.BigInteger, primary_key=True)
    repository_name = db.Column(db.String(255))
    repository_owner = db.Column(db.String(255))
    pusher = db.Column(db.String(255))
    ref = db.Column(db.String(255))
    before_sha = db.Column(db.String(40))
    after_sha = db.Column(db.String(40))
    received_at = db.Column(db.DateTime, default=datetime.utcnow)
    invalid_commits = db.relationship('InvalidCommit', backref='event', lazy=True, cascade="all, delete-orphan")

# OAuth2 无效提交模型
class InvalidCommit(db.Model):
    __tablename__ = 'invalid_commits'
    id = db.Column(db.BigInteger, primary_key=True)
    sha = db.Column(db.String(40))
    author = db.Column(db.String(255))
    message = db.Column(db.Text)
    url = db.Column(db.String(512))
    detected_at = db.Column(db.DateTime, default=datetime.utcnow)
    event_id = db.Column(db.BigInteger, db.ForeignKey('webhook_events.id'), nullable=False)

# OAuth2 用户授权信息模型
class Auth(db.Model):
    __tablename__ = 'auth'
    
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 主键，自增
    installation_id = db.Column(db.String(512), nullable=False) # 安装ID
    access_token = db.Column(db.String(512), nullable=False)  # OAuth2 访问令牌
    refresh_token = db.Column(db.String(512))  # OAuth2 刷新令牌
    expires_in = db.Column(db.BigInteger)  # 访问令牌的过期时间
    refresh_token_expires_in = db.Column(db.BigInteger)  # 刷新令牌的过期时间
    create_at = db.Column(db.DateTime, default=datetime.utcnow)  # 创建时间
    update_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)  # 更新时间

    user_id = db.Column(db.String(255), db.ForeignKey('user.id'), nullable=False)  # 外键关联到用户表
    user = db.relationship('User', backref='auth', lazy=True)  # 与用户表的关系

# 用户信息模型
class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(db.String(255), primary_key=True)  # 用户唯一标识符（Git 用户 ID）
    login = db.Column(db.String(255), nullable=False)  # 用户登录名
    name = db.Column(db.String(255), nullable=False)  # 用户显示名称
    email = db.Column(db.String(255), nullable=False)  # 用户邮箱
    phone = db.Column(db.String(20))  # 用户电话（可选）
    avatar_url = db.Column(db.String(512))  # 用户头像 URL
    bio = db.Column(db.Text)  # 用户个人简介
    company = db.Column(db.String(255))  # 用户所在公司
    location = db.Column(db.String(255))  # 用户所在位置
    blog = db.Column(db.String(255))  # 博客地址
    followers=db.Column(db.Integer)  # 粉丝数
    following=db.Column(db.Integer)  # 关注数
    hide_email=db.Column(db.Integer)  # 隐藏邮箱
    html_url=db.Column(db.String(512)) # 个人主页
    owned_private_repos=db.Column(db.Integer) # 私有仓库数
    public_repos=db.Column(db.Integer) # 公开仓库数
    total_private_repos=db.Column(db.Integer) # 私有仓库总数
    total_repos = db.Column(db.Integer) # 总仓库数
    url=db.Column(db.String(512)) # 个人主页

    created_at = db.Column(db.DateTime, default=datetime.utcnow)  # 创建时间
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)  # 更新时间

# 提交信息模型
class CommitInfo:
    def __init__(self, name, email, message):
        self.name = name
        self.email = email
        self.message = message